#coding=utf-8
#完整的登录以及注册
#验证一个文本里面的密码，如果正确返回，不正确重试3次，添加注册（用户名和密码）登陆流程，密码文件使用 pickle 标准库保存

#.首先可以定义一个类，用来实例化对象，并且完成判定该对象是否已经注册，给出对应提示。

# class login_user():
	
	#验证用户是否存在
def check_user(user_name):
	user_list = []
	try:
		with open('user_passwd.txt') as upfile:
			for u_data in upfile.readlines():
				u_name,u_passwd = u_data.strip().split(':')
				user_list.append(u_name)
		if user_name in user_list:
			return True
		else:
			return False		
	except Exception as e:
		raise e

#验证密码是否存在
def check_passwd(thename,thepasswd):
	try:
		with open('user_passwd.txt') as upfile:
			for u_data in upfile.readlines():
				u_name,u_passwd = u_data.strip().split(':')
				if u_name == thename:
					dqpasswd = u_passwd
					break
			if dqpasswd ==thepasswd:
				dqpasswd = None  #这个地方再次初始化是因为如果正确登录过一次，不初始化后面再登录就算密码错误也会判定成功,必须初始化重新取值判定
				return True
			else:
				return False		
	except Exception as e:
		raise e
	
#注册用户
def register(user_name,user_passwd):
	try:
		with open('user_passwd.txt','a+') as upfile:
			upfile.write(user_name + ':' + user_passwd + '\n')
	except Exception as e:
		raise e

#登陆，首先还是要判断账号是否已经存在，如果没有就注册，如有就登陆。
def login():
	while True:
		break_flag = False #在父循环中设定一个跳出标志，子循环只要想连父亲一块跳出时，就把这个标志改成True 
		print("\033[1;32m ***welcome*** \033[0m")
		chose = input("\033[1;32m 请选择：1.登陆  2.注册  3.退出 \033[0m")
		chose = int(chose)
		if chose == 1:
			input_user = input("\033[1;32m 请输入你的用户名: \033[0m")
			#check input_user is exists or not.
			count = 0
			if check_user(input_user):
				while count<3:
					input_passwd = input("\033[1;32m 请输入你的密码: \033[0m")
					#check input_passwd is right or not
					if check_passwd(input_user,input_passwd):
						print("\033[1;35m 登录成功!欢迎！ \033[0m")
						break
					else:
						print("\033[1;31m 抱歉，密码错误，注意密码错误三次将退出！ \033[0m")
						count += 1
						continue
				else:
					print("\033[1;31m *\033[0m"*20)
					print("\033[1;31m 错误输入密码已达三次，退出！\033[0m")
				#完成了登录步骤，该跳出整个循环了
				break_flag = True
			else:
				print("\033[1;31m 没有该用户，请核实用户名! \033[0m")
		elif chose == 2:
			while True:
				re_in_user = input("\033[1;32m 请输入用户名: \033[0m")
				#check user if exists.
				if check_user(re_in_user):
					print("\033[1;31m 抱歉，该用户名已经被注册！！！ \033[0m")
					if_continue_register = input("\033[1;32m 是否继续注册?输入:1(继续注册)，2(退出注册),3(退出程序) \033[0m")
					if_continue_register = int(if_continue_register)
					if if_continue_register == 1:
						continue
					elif if_continue_register == 2:
						break
					elif if_continue_register == 3:
						break_flag = True
						break
					else:
						print("\033[1;31m 输入错误，只能输入1 2 3中的一个。 \033[0m")
				else:
					re_in_passwd = input("\033[1;35m 用户名可以使用,请输入密码: \033[0m")
					register(re_in_user,re_in_passwd)
					print("\033[1;35m 注册成功!!! \033[0m")
					break

		elif chose == 3:
			print("\033[1;35m ***已退出*** \033[0m")
			break
		else:
			print("\033[1;31m 抱歉，选项输入错误，只能输入数字1 2 3中的一个！ \033[0m")

		#如果子类循环想父循环也跳出
		if break_flag:
			break

if __name__ == '__main__':
	login()

# input和print中的:  \033[1;31m  ...  \033[0m   是给打印的...加颜